package lol.clann.bukkit.pluginboot.commands;

import lol.clann.bukkit.pluginboot.newcommand.BukkitCommand;
import lol.clann.bukkit.pluginboot.util.Validator;
import lol.clann.clannboot.annotation.inject.Inject;
import lol.clann.clannboot.annotation.svc.Service;
import lol.clann.clannboot.command.annotation.Command;
import lol.clann.clannboot.command.annotation.param.Sender;
import lol.clann.clannboot.module.Module;
import org.apache.commons.lang3.time.StopWatch;
import org.bukkit.command.CommandSender;
import org.slf4j.Logger;

import java.util.concurrent.TimeUnit;

/**
 * @author pyz
 * @date 2018/9/22 上午10:31
 */
@Service
public class CommandModule extends BukkitCommand {

    @Inject
    private Logger logger;
    @Inject
    private Module root;
    @Inject
    private Validator validator;

    public CommandModule() {
        super("module");
    }

    @Command(args = "<moduleId>", des = "重载模块")
    public void reload(@Sender CommandSender sender, Module module) {
        logger.info("开始重载模块:{}", module.getName());
        sender.sendMessage("开始重载模块:" + module.getName());
        StopWatch watch = StopWatch.createStarted();
        module.reloadConfig();
        watch.stop();
        sender.sendMessage("重载完毕,耗时" + watch.getTime(TimeUnit.MILLISECONDS) + "ms");
    }

    //
//    @CommandAnnotation(args = "<jar>", des = "加载模块")
//    public void load(@Sender CommandSender sender, String jarName) {
//
//    }
//
//    @CommandAnnotation(args = "<moduleId>", des = "卸载模块")
//    public void unload(@Sender CommandSender sender, String moduleId) throws MalformedURLException {
//        Module module = ModuleContext.getModule(moduleId);
//        validator.notNull(module, "无效的moduleId:" + moduleId);
//        logger.info("开始卸载模块{}", module.getName());
//        URL jarURL = module.getPath().toUri().toURL();
//        Stopwatch watch = Stopwatch.createStarted();
//        // 停止模块
//        module.stop();
//        // 清除class缓存
//        ClassUtils.reset();
//        // 回收模块资源
//        System.gc();
//        // 从jvm中卸载jar
//        URLClassLoader classloader = (URLClassLoader) module.getClass().getClassLoader();
//        ArrayList<URL> path = Invoker.of(classloader).get("ucp").get("path").get();
//        Stack<URL> urls = Invoker.of(classloader).get("ucp").get("urls").get();
//        path.remove(jarURL);
//        urls.remove(jarURL);
//        Invoker.of(URLClassPath.class).invoke("disableAllLookupCaches");
//        System.gc();
//        watch.stop();
//        sender.sendMessage("重载卸载,耗时" + watch.elapsed(TimeUnit.MILLISECONDS) + "ms");
//    }

}
